package com.zoespeer.food_delivery_comment_api.controller;

import com.zoespeer.food_delivery_comment_api.common.ApiResponse;
import com.zoespeer.food_delivery_comment_api.service.FileService;
import com.zoespeer.food_delivery_comment_api.common.JwtUtil;
import com.zoespeer.food_delivery_comment_api.vo.FileUploadResultVO;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件上传接口控制器
 */
@RestController
@RequestMapping("/api/file") // 接口基础路径
public class FileController {

    @Autowired
    private FileService fileService;

    /**
     * 上传图片或视频接口
     * @param token 请求头中的Authorization（Bearer Token）
     * @param file 上传的二进制文件（multipart/form-data 格式，参数名固定为file）
     * @return 包含文件URL的统一响应
     */
    @PostMapping("/uploadFile") // 接口路径，与需求一致
    public ApiResponse<FileUploadResultVO> uploadFile(
            @RequestHeader("Authorization") String token, // 校验登录态
            @RequestParam("file") MultipartFile file       // 接收二进制文件
    ) {
        // 1. Token 格式校验（必须以 Bearer 开头）
        if (token == null || !token.startsWith("Bearer ")) {
            return ApiResponse.error("无效的Token格式，请使用 Bearer Token");
        }

        // 2. 提取纯Token（去除 Bearer 前缀）
        String actualToken = token.substring(7).trim();

        // 3. Token 有效性校验（解析用户ID，确保登录态合法）
        try {
            JwtUtil.getUserIdFromToken(actualToken); // 仅校验Token，无需返回用户ID
        } catch (ExpiredJwtException e) {
            return ApiResponse.error("Token已过期，请重新登录");
        } catch (JwtException e) {
            return ApiResponse.error("无效的Token：" + e.getMessage());
        } catch (Exception e) {
            return ApiResponse.error("Token解析失败：" + e.getMessage());
        }

        // 4. 调用Service处理文件上传
        try {
            FileUploadResultVO uploadResult = fileService.uploadFile(file);
            return ApiResponse.success(uploadResult, "文件上传成功");
        } catch (RuntimeException e) {
            return ApiResponse.error(e.getMessage());
        }
    }
}